﻿using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

/////////////////////////////////////////////////////////////////////
// TextureFactory.cs
// Erstellt am: 15.1.13
// Letzte Änderungen:
// 16.1.13 - Funktion BlancTexture umbenannt zu EmptyTexture
//
// Funktionen:
// Texture2D EmptyTexture(...)
// Texture2D TextureFromRectangle(...)
// Texture2D[] CutTexture(...)
//
// Beschreibung:
// Die Klasse dient zur schnellen Erzeugung von Texturen aus anderen
// Texturen oder kann leere Texturen Erzeugen
/////////////////////////////////////////////////////////////////////

namespace JumpAndRun.Factory
{
	public class TextureFactory
	{
		#region Private Functions
		private static Texture2D GetTexture(Texture2D texture, GraphicsDevice g, SpriteBatch sb, int x, int y, int w, int h)
		{
			RenderTarget2D ret = new RenderTarget2D(g, w, h);
			g.SetRenderTarget(ret);
			g.Clear(new Color(0, 0, 0, 0));

			sb.Begin();
			sb.Draw(texture, Vector2.Zero, new Rectangle(x, y, w, h), Color.White);
			sb.End();

			g.SetRenderTarget(null);

			return (Texture2D)ret;
		}

		private static Texture2D GetTexture(Texture2D texture, int x, int y, int w, int h)
		{
			GraphicsDevice g = texture.GraphicsDevice;
			SpriteBatch sb = new SpriteBatch(g);

			return GetTexture(texture, g, sb, x, y, w, h);
		}
		#endregion

		#region Public Functions
		// Function Texture2D EmptyTexture(...)
		//
		// Params:
		// device - Standard GraphicsDevice. Wird benötigt um die Texture zu erzeugen
		// width, height - Die Größe der zu erstellenen Texture in Pixel
		// color - die Farbe mit der die Texture gefüllt wird
		public static Texture2D EmptyTexture(GraphicsDevice device, int width, int height, Color color)
		{
			Texture2D tex = new Texture2D(device, width, height);
			Color[] colorData = new Color[width * height];

			for (int i = 0; i < colorData.Length; i++)
				colorData[i] = color;

			tex.SetData<Color>(colorData);

			return tex;
		}

		// Function Texture2D TextureFromRectangle(...)
		//
		// Params:
		// texture - Die Texture von der kopiert werden soll
		// x, y - Koordinaten in Pixel auf der Texture
		// w, h - Größe des Rechteckts in Pixel
		public static Texture2D TextureFromRectangle(Texture2D texture, int x, int y, int w, int h)
		{

			return GetTexture(texture, x, y, w, h);
		}

		// Function Texture2D TextureFromRectangle(...)
		//
		// Params:
		// texture - Die Texture von der kopiert werden soll
		// rectangle - Das zu beschreibene Rechteck auf der Texture
		public static Texture2D TextureFromRectangle(Texture2D texture, Rectangle rectangle)
		{
			return GetTexture(texture, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height);
		}

		// Function Texture2D[] CutTexture(...)
		//
		// Beschreibung:
		// Die Funktion teilt eine Texture in kleine Texturen und liefert diese als Array zurück
		//
		// Params:
		// texture - Die Texture die geteilt werden soll
		// tileWidth, tileHeight - Die größe die ein einzelnes Tile hat in Pixel
		private static Texture2D[] CutTexture(Texture2D texture, int tileWidth, int tileHeight)
		{
			int rows = texture.Width / tileWidth;
			int cols = texture.Height / tileHeight;

			Texture2D[] textures = new Texture2D[rows * cols];

			GraphicsDevice g = texture.GraphicsDevice;
			SpriteBatch sb = new SpriteBatch(g);
			
			for (int y = 0; y < cols; y++)
			{
				for (int x = 0; x < rows; x++)
				{
					textures[x + y * rows] = GetTexture(texture, g, sb, x * tileWidth, y * tileHeight, tileWidth, tileHeight);
				}
			}

			return textures;
		}
		#endregion
	}
}
